En omfattande guide till React Refs, med fokus pÄ useRef och createRef. LÀr dig effektiv komponenthantering och DOM-Ätkomst i globala applikationer.
React Refs: Klargörande av useRef vs. createRef
I React-utvecklingens dynamiska vÀrld Àr effektiv hantering av komponenttillstÄnd och interaktion med Document Object Model (DOM) avgörande. React Refs erbjuder en mekanism för att direkt komma Ät och manipulera DOM-element eller React-komponenter. TvÄ primÀra metoder för att skapa Refs Àr useRef
och createRef
. Ăven om bĂ„da tjĂ€nar syftet att skapa Refs, skiljer de sig Ă„t i sin implementering och sina anvĂ€ndningsfall. Denna guide syftar till att avmystifiera dessa tvĂ„ tillvĂ€gagĂ„ngssĂ€tt och ge klarhet i nĂ€r och hur du effektivt kan utnyttja dem i dina React-projekt, sĂ€rskilt nĂ€r du utvecklar för en global publik.
FörstÄ React Refs
En Ref (kort för referens) Àr en React-funktion som gör att du kan komma Ät en DOM-nod eller en React-komponent direkt. Detta Àr sÀrskilt anvÀndbart nÀr du behöver:
- Direkt manipulera ett DOM-element, som att fokusera ett inmatningsfÀlt.
- Ă tkomst till en underkomponents metoder eller egenskaper.
- Hantera vÀrden som kvarstÄr över renderingar utan att orsaka nya renderingar (liknande instansvariabler i klasskomponenter).
Medan React uppmuntrar ett deklarativt tillvÀgagÄngssÀtt, dÀr anvÀndargrÀnssnittet hanteras via tillstÄnd och props, finns det situationer dÀr direkt manipulation Àr nödvÀndig. Refs tillhandahÄller ett sÀtt att överbrygga klyftan mellan Reacts deklarativa natur och imperativa DOM-operationer.
createRef
: Klasskomponentmetoden
createRef
Àr en metod som tillhandahÄlls av React. Den anvÀnds frÀmst inom klasskomponenter för att skapa Refs. Varje gÄng en klasskomponent instansieras, skapar createRef
ett nytt Ref-objekt. Detta sÀkerstÀller att varje instans av komponenten har sin egen unika Ref.
Syntax och AnvÀndning
För att anvÀnda createRef
deklarerar du först en Ref i din klasskomponent, vanligtvis i konstruktorn. Sedan kopplar du Refen till ett DOM-element eller en komponent med hjÀlp av attributet ref
.
class MyComponent extends React.Component {
constructor(props) {
super(props);
this.myRef = React.createRef();
}
componentDidMount() {
// Ă
tkomst till DOM-elementet efter att komponenten har monterats
this.myRef.current.focus();
}
render() {
return ;
}
}
I detta exempel skapas this.myRef
med hjÀlp av React.createRef()
. Den tilldelas sedan till attributet ref
för inmatningselementet. Efter att komponenten monterats (i componentDidMount
), kan du komma Ät den faktiska DOM-noden med hjÀlp av this.myRef.current
och utföra operationer pÄ den (i detta fall, fokusera inmatningen).
Exempel: Fokusera ett InmatningsfÀlt
LÄt oss övervÀga ett scenario dÀr du vill fokusera ett inmatningsfÀlt automatiskt nÀr en komponent monteras. Detta Àr ett vanligt anvÀndningsfall för Refs, sÀrskilt i formulÀr eller interaktiva element.
class FocusInput extends React.Component {
constructor(props) {
super(props);
this.inputRef = React.createRef();
}
componentDidMount() {
this.inputRef.current.focus();
}
render() {
return (
);
}
}
I detta exempel fokuserar FocusInput
inmatningsfÀltet omedelbart efter montering. Detta kan förbÀttra anvÀndarupplevelsen genom att rikta anvÀndarens uppmÀrksamhet mot inmatningselementet sÄ snart komponenten renderas.
Viktiga övervÀganden med createRef
- Endast Klasskomponenter:
createRef
Ă€r utformad för anvĂ€ndning i klasskomponenter. Ăven om den tekniskt sett kan fungera i funktionella komponenter, Ă€r det inte den avsedda anvĂ€ndningen och kan leda till ovĂ€ntat beteende. - Ny Ref vid Varje Instans: Varje instans av en klasskomponent fĂ„r sin egen
createRef
. Detta Àr viktigt för att upprÀtthÄlla isolering mellan komponentinstanser.
useRef
: Den Funktionella Komponent-Hooken
useRef
Àr en Hook som introducerades i React 16.8. Den tillhandahÄller ett sÀtt att skapa förÀnderliga Ref-objekt inom funktionella komponenter. Till skillnad frÄn createRef
returnerar useRef
samma Ref-objekt varje gÄng komponenten renderas. Detta gör den idealisk för att bevara vÀrden över renderingar utan att utlösa nya renderingar.
Syntax och AnvÀndning
Att anvÀnda useRef
Ă€r enkelt. Du anropar useRef
-Hooken och skickar ett initialt vÀrde. Hooken returnerar ett objekt med en .current
-egenskap, som du sedan kan anvÀnda för att komma Ät och modifiera vÀrdet.
import React, { useRef, useEffect } from 'react';
function MyFunctionalComponent() {
const myRef = useRef(null);
useEffect(() => {
// Ă
tkomst till DOM-elementet efter att komponenten har monterats
if (myRef.current) {
myRef.current.focus();
}
}, []);
return ;
}
I detta exempel skapar useRef(null)
en Ref med ett initialt vÀrde av null
. useEffect
-Hooken anvÀnds för att komma Ät DOM-elementet efter att komponenten har monterats. Egenskapen myRef.current
hÄller referensen till inmatningselementet, vilket gör att du kan fokusera det.
Exempel: SpÄra Tidigare Prop-VÀrden
Ett kraftfullt anvÀndningsfall för useRef
Àr att spÄra det tidigare vÀrdet av en prop. Eftersom Àndringar i Refs inte utlöser nya renderingar, kan du anvÀnda dem för att lagra vÀrden som du vill ska kvarstÄ över renderingar utan att pÄverka anvÀndargrÀnssnittet.
import React, { useRef, useEffect } from 'react';
function PreviousValueComponent({ value }) {
const previousValue = useRef();
useEffect(() => {
previousValue.current = value;
}, [value]);
return (
Aktuellt VĂ€rde: {value}
Tidigare VĂ€rde: {previousValue.current}
);
}
I detta exempel lagrar previousValue.current
det tidigare vÀrdet av value
-prop:en. useEffect
-Hooken uppdaterar Refen nÀrhelst value
-prop:en Àndras. Detta gör att du kan jÀmföra nuvarande och tidigare vÀrden, vilket kan vara anvÀndbart för att upptÀcka Àndringar eller implementera animationer.
Viktiga övervÀganden med useRef
- Endast Funktionella Komponenter:
useRef
Àr en Hook och kan endast anvÀndas inom funktionella komponenter eller anpassade Hooks. - KvarstÄr över Renderingar:
useRef
-Hooken returnerar samma Ref-objekt vid varje rendering. Detta Àr nyckeln till dess förmÄga att bevara vÀrden utan att utlösa nya renderingar. - FörÀnderlig
.current
Egenskap: Du kan direkt modifiera.current
-egenskapen hos Ref-objektet. - Initialt VÀrde: Du kan ange ett initialt vÀrde till
useRef
. Detta vÀrde kommer att tilldelas.current
-egenskapen nÀr komponenten först renderas. - Inga Nya Renderingar: Att modifiera
.current
-egenskapen för en Ref orsakar ingen ny rendering av komponenten.
useRef
vs. createRef
: En Detaljerad JÀmförelse
Nu nÀr vi har utforskat bÄde useRef
och createRef
individuellt, lÄt oss jÀmföra dem sida vid sida för att belysa deras viktigaste skillnader och nÀr man ska vÀlja den ena framför den andra.
Funktion | useRef |
createRef |
---|---|---|
Komponenttyp | Funktionella Komponenter | Klasskomponenter |
Hook eller Metod | Hook | Metod |
Ref-instans | Returnerar samma Ref-objekt vid varje rendering | Skapar ett nytt Ref-objekt vid varje instans av komponenten |
AnvÀndningsomrÄden |
|
|
VĂ€lja RĂ€tt Ref: En Beslutsguide
HÀr Àr en enkel guide som hjÀlper dig att vÀlja mellan useRef
och createRef
:
- Arbetar du med en funktionell komponent? AnvÀnd
useRef
. - Arbetar du med en klasskomponent? AnvÀnd
createRef
. - Behöver du bevara ett vÀrde över renderingar utan att utlösa nya renderingar? AnvÀnd
useRef
. - Behöver du spÄra det tidigare vÀrdet av en prop? AnvÀnd
useRef
.
Bortom DOM-manipulation: Avancerade AnvÀndningsfall för Refs
Ăven om Ă„tkomst och manipulation av DOM-element Ă€r ett primĂ€rt anvĂ€ndningsfall för Refs, erbjuder de möjligheter utöver denna kĂ€rnfunktionalitet. LĂ„t oss utforska nĂ„gra avancerade scenarier dĂ€r Refs kan vara sĂ€rskilt anvĂ€ndbara.
1. Ă tkomst till Underkomponentmetoder
Refs kan anvÀndas för att komma Ät metoder definierade i underkomponenter. Detta gör att en förÀlderkomponent direkt kan utlösa ÄtgÀrder eller hÀmta data frÄn sina barn. Detta tillvÀgagÄngssÀtt Àr sÀrskilt anvÀndbart nÀr du behöver finkornig kontroll över underkomponenter.
class ParentComponent extends React.Component {
constructor(props) {
super(props);
this.childRef = React.createRef();
}
handleClick = () => {
// Anropa en metod pÄ underkomponenten
this.childRef.current.doSomething();
};
render() {
return (
);
}
}
class ChildComponent extends React.Component {
doSomething = () => {
console.log('UnderkomponentÄtgÀrd utlöst!');
};
render() {
return Detta Àr en underkomponent.;
}
}
I detta exempel anvÀnder ParentComponent
en Ref för att komma Ät ChildComponent
och anropa dess doSomething
-metod.
2. Hantera Fokus och Markering
Refs Àr ovÀrderliga för att hantera fokus och markering inom inmatningsfÀlt och andra interaktiva element. Detta Àr avgörande för att skapa tillgÀngliga och anvÀndarvÀnliga grÀnssnitt.
import React, { useRef, useEffect } from 'react';
function FocusOnMount() {
const inputRef = useRef(null);
useEffect(() => {
if (inputRef.current) {
inputRef.current.focus();
inputRef.current.select(); // Markera texten i inmatningen
}
}, []);
return ;
}
Detta exempel fokuserar inmatningen och markerar dess text sÄ snart komponenten monteras.
3. Animera Element
Refs kan anvÀndas i kombination med animationsbibliotek (som GreenSock eller Framer Motion) för att direkt manipulera DOM och skapa komplexa animationer. Detta möjliggör finkornig kontroll över animationssekvenser.
Exempel med enkel JavaScript för enkelhetens skull:
import React, { useRef, useEffect } from 'react';
function AnimatedBox() {
const boxRef = useRef(null);
useEffect(() => {
const box = boxRef.current;
if (box) {
// Enkel animation: flytta rutan till höger
box.animate(
[
{ transform: 'translateX(0)' },
{ transform: 'translateX(100px)' },
],
{
duration: 1000, // 1 sekund
iterations: Infinity, // Upprepa för evigt
direction: 'alternate',
}
);
}
}, []);
return ;
}
Detta exempel anvÀnder Web Animations API för att animera en enkel ruta och flytta den fram och tillbaka horisontellt.
BÀsta Praxis för att AnvÀnda React Refs i Globala Applikationer
NÀr du utvecklar React-applikationer för en global publik Àr det viktigt att övervÀga hur Refs interagerar med internationalisering (i18n) och lokalisering (l10n). HÀr Àr nÄgra bÀsta metoder:
1. TillgÀnglighet (A11y)
Se till att din anvÀndning av Refs inte negativt pÄverkar tillgÀngligheten. NÀr du till exempel programmatiskt fokuserar element, övervÀg anvÀndarens fokusordning och om fokusÀndringen Àr lÀmplig för skÀrmlÀsare och tangentbordsanvÀndare.
import React, { useRef, useEffect } from 'react';
function AccessibleFocus() {
const buttonRef = useRef(null);
useEffect(() => {
const button = buttonRef.current;
if (button) {
// Fokusera endast om knappen inte redan Àr fokuserad av anvÀndaren
if (document.activeElement !== button) {
button.focus();
}
}
}, []);
return ;
}
2. Internationaliserade InmatningsfÀlt
NÀr du arbetar med inmatningsfÀlt, var medveten om olika inmatningsmetoder och teckenuppsÀttningar som anvÀnds i olika sprÄk. Se till att dina Ref-baserade manipulationer (t.ex. markering, markörposition) fungerar korrekt över olika inmatningstyper och sprÄk. Testa dina komponenter noggrant med olika sprÄk och inmatningsmetoder.
3. Höger-till-VÀnster (RTL) Layouter
Om din applikation stöder RTL-sprÄk (t.ex. arabiska, hebreiska), se till att dina DOM-manipulationer med Refs tar hÀnsyn till den omvÀnda layouten. NÀr du till exempel animerar element, övervÀg att vÀnda animationsriktningen för RTL-sprÄk.
4. PrestandaövervÀganden
Ăven om Refs erbjuder ett kraftfullt sĂ€tt att interagera med DOM, kan överanvĂ€ndning leda till prestandaproblem. Direkt DOM-manipulation kringgĂ„r Reacts virtuella DOM- och avstĂ€mningsprocess, vilket potentiellt kan leda till inkonsekvenser och lĂ„ngsammare uppdateringar. AnvĂ€nd Refs omdömesgillt och endast nĂ€r det Ă€r nödvĂ€ndigt.
Slutsats
React Refs, specifikt useRef
och createRef
, Àr ovÀrderliga verktyg för React-utvecklare. Att förstÄ nyanserna i varje tillvÀgagÄngssÀtt och nÀr man effektivt ska tillÀmpa dem Àr avgörande för att bygga robusta och högpresterande applikationer. createRef
förblir standarden för att hantera Refs inom klasskomponenter, vilket sÀkerstÀller att varje instans har sin unika Ref. useRef
, med sin ihÄllande natur över renderingar, Àr idealisk för funktionella komponenter, och erbjuder ett sÀtt att hantera DOM-element och bevara vÀrden utan att utlösa onödiga nya renderingar. Genom att klokt utnyttja dessa verktyg kan du förbÀttra funktionaliteten och anvÀndarupplevelsen i dina React-applikationer och tillgodose en global publik med tillgÀngliga och högpresterande grÀnssnitt.
NÀr React fortsÀtter att utvecklas kommer att bemÀstra dessa grundlÀggande koncept att ge dig möjlighet att skapa innovativa och anvÀndarvÀnliga webbupplevelser som överskrider geografiska och kulturella grÀnser. Kom ihÄg att prioritera tillgÀnglighet, internationalisering och prestanda för att leverera verkligt globala applikationer.